﻿/*****************************************************************//**
 * @file    OperGraphEvent3D.h
 * @brief   三维可视化事件操作器抽象类。
 *  
 * @author  ChengHaotian (yeguangbaozi@foxmail.com)
 * @date    2024-06-12
 *********************************************************************/

#ifndef __OPERGRAPHEVENT3D_H__
#define __OPERGRAPHEVENT3D_H__

#include "OperatorsInterface/GraphEventOperator.h"

// 前置声明
namespace Comp
{
    class FITKGraph3DWindowVTK;
}

namespace Exchange
{
    class FITKAcousticsVTKGraphObject3D;
}

namespace GUIOper
{
    /**
     * @brief   可视化事件操作器。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-06-12
     */
    class OperGraphEvent3D : public EventOper::GraphEventOperator
    {
        Q_OBJECT

    protected:
        /**
         * @brief   构造函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        explicit OperGraphEvent3D() = default;

        /**
         * @brief   析构函数。[虚函数]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        virtual ~OperGraphEvent3D() = default;
        /**
         * @brief    获取当前激活或第一个三维渲染窗口
         * @return   Comp::FITKGraph3DWindowVTK*               三维渲染窗口
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-03-05
         */
        Comp::FITKGraph3DWindowVTK* getPreGraphWidget();
        /**
         * @brief    获取当前所有的三维渲染窗口
         * @return   QList<Comp::FITKGraph3DWindowVTK*>       三维渲染窗口列表
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-03-05
         */
        QList<Comp::FITKGraph3DWindowVTK*> getAllGraphWidget();

        /**
         * @brief   添加可视化对象至三维窗口。
         * @param   obj：可视化对象
         * @param   graphWidget：三维窗口
         * @param   fitView：是否重置视角[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        void addGraphObjectToWidget(Exchange::FITKAcousticsVTKGraphObject3D* obj, Comp::FITKGraph3DWindowVTK* graphWidget, bool fitView = false);

        /**
         * @brief   快速添加可视化对象至三维窗口。（无视相机视角与包围盒计算）
         *          
         *          P.S.
         *          仅在大批量添加可视化对象时使用，内部不对指针进行判空。
         * 
         * @param   obj：可视化对象
         * @param   graphWidget：三维窗口
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        void fastAddGraphObjectToWidget(Exchange::FITKAcousticsVTKGraphObject3D* obj, Comp::FITKGraph3DWindowVTK* graphWidget);
        /**
         * @brief    通过数据对象ID获取可视化对象。（没有则创建）
         * @param[i] dataObjId                                           数据对象ID
         * @param[i] forceUpdate                                         是否强制刷新
         * @return   QList<Exchange::FITKAcousticsVTKGraphObject3D*>     可视化列表
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-16
         */
        QList<Exchange::FITKAcousticsVTKGraphObject3D*> getGraphObjectsByDataId(int dataObjId, bool forceUpdate = false);

        /**
         * @brief   保存运行参数。
         * @param   key：参数名称（键）
         * @param   value：参数值
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-12
         */
        void saveRuntimeSettings(QString key, QVariant value);

        /**
         * @brief   刷新渲染窗口。[重写]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-07-24
         */
        void reRender() override;
        /**
         * @brief    自适应
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-03-06
         */
        void fitView() override;
    };

}  // namespace GUIOper

#endif // __OPERGRAPHEVENT3D_H__
